package com.example.hctorisrael.deadolympics;

import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;

import org.andengine.audio.music.Music;
import org.andengine.audio.music.MusicFactory;
import org.andengine.engine.camera.Camera;
import org.andengine.entity.scene.background.SpriteBackground;
import org.andengine.entity.scene.menu.MenuScene;
import org.andengine.entity.scene.menu.item.IMenuItem;
import org.andengine.entity.scene.menu.item.SpriteMenuItem;
import org.andengine.entity.scene.menu.item.decorator.ScaleMenuItemDecorator;
import org.andengine.entity.sprite.Sprite;
import org.andengine.opengl.util.GLState;

import java.io.IOException;
import java.util.Random;

/**
 * Representa la escena con las opciones del menú principal
 *
 *
 */
public class EscenaMenu extends EscenaBase
{
    // *** Fondo
    private Sprite spriteFondo;
    //Botones
    private MenuScene menu;
    private final int OPCION_ACERCA_DE = 0;
    private final int OPCION_START = 1;
    private final int OPCION_SCORES = 2;
    private final int OPCION_AYUDA = 3;
    //Musica
    private Music musicaFondo;

    //Marcador
    public Marcador marcador;

    @Override
    public void crearEscena() {
        // Creamos el sprite de manera óptima
        spriteFondo = new Sprite(0,0, admRecursos.regionFondoMenu,admRecursos.vbom) {
            @Override
            protected void preDraw(GLState pGLState, Camera pCamera) {
                super.preDraw(pGLState, pCamera);
                pGLState.enableDither();
            }
        };
        // Configuración de la imagen
        spriteFondo.setPosition(ControlJuego.ANCHO_CAMARA/2,ControlJuego.ALTO_CAMARA/2);

        // Crea el fondo de la pantalla
        SpriteBackground fondo = new SpriteBackground(0,0,0,spriteFondo);
        setBackground(fondo);
        setBackgroundEnabled(true);

        agregarBotenes();
        crearSonidos();
    }


    private void agregarBotenes() {
        // Crea el objeto que representa el menú
        menu = new MenuScene(admRecursos.camara);
        menu.setPosition(ControlJuego.ANCHO_CAMARA/2,ControlJuego.ALTO_CAMARA/2);

        final IMenuItem opcionAcercaDe = new ScaleMenuItemDecorator(new SpriteMenuItem(OPCION_ACERCA_DE,
                admRecursos.regionBotonAcercaDe,admRecursos.vbom), 1.5f, 1);
        final IMenuItem opcionStart = new ScaleMenuItemDecorator(new SpriteMenuItem(OPCION_START,
                admRecursos.regionBotonStart,admRecursos.vbom),1.5f,1);
        final IMenuItem opcionScores = new ScaleMenuItemDecorator(new SpriteMenuItem(OPCION_SCORES,
                admRecursos.regionBotonScores,admRecursos.vbom),1.5f,1);
        final IMenuItem opcionAyuda = new ScaleMenuItemDecorator(new SpriteMenuItem(OPCION_AYUDA,
                admRecursos.regionBotonAyuda,admRecursos.vbom),1.5f,1);
        // Agrega las opciones al menú
        menu.addMenuItem(opcionAcercaDe);
        menu.addMenuItem(opcionStart);
        menu.addMenuItem(opcionScores);
        menu.addMenuItem(opcionAyuda);
        menu.buildAnimations();
        menu.setBackgroundEnabled(false);
        // Ubicar las opciones DENTRO del menú.
        opcionAcercaDe.setPosition(180, -170);
        opcionStart.setPosition(-170, 0);
        opcionScores.setPosition(190,0);
        opcionAyuda.setPosition(-190,-200);
        // Registra el Listener para atender las opciones
        menu.setOnMenuItemClickListener(new MenuScene.IOnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClicked(MenuScene pMenuScene, IMenuItem pMenuItem,
                                             float pMenuItemLocalX, float pMenuItemLocalY) {
                switch(pMenuItem.getID()) {
                    case OPCION_ACERCA_DE:
                        // Mostrar la escena de AcercaDe
                        musicaFondo.stop();
                        admEscenas.crearEscenaAcercaDe();
                        admEscenas.setEscena(TipoEscena.ESCENA_ACERCA_DE);
                        admEscenas.liberarEscenaMenu();
                        break;
                    case OPCION_START:
                        marcador = new Marcador(admRecursos.engine, admRecursos.actividadJuego);
                        admRecursos.camara.setHUD(marcador);
                        SharedPreferences preferencias = admRecursos.actividadJuego.getSharedPreferences(
                                "Estado", Context.MODE_PRIVATE);
                        SharedPreferences.Editor editor = preferencias.edit();
                        editor.putInt("puntaje",0);
                        editor.putInt("vidas",3);
                        //editor.putInt("First", marcador.getMarcadorMasAlto());
                        //editor.putInt("Second", marcador.getMarcadorMasAltoDos());
                        editor.commit();
                        musicaFondo.stop();
                        Random r = new Random();
                        int numero = r.nextInt(3);
                        // Mostrar la escena del Juego Random
                        if(numero ==0) {
                            admEscenas.crearEscenaJuego();
                            admEscenas.setEscena(TipoEscena.ESCENA_JUEGO);
                            admEscenas.liberarEscenaMenu();
                            break;
                        }
                        else if(numero == 1){
                            admEscenas.crearEscenaJuegoDos();
                            admEscenas.setEscena(TipoEscena.ESCENA_JUEGODOS);
                            admEscenas.liberarEscenaMenu();
                            break;
                        }
                        else if(numero ==2){
                            admEscenas.crearEscenaJuegoTres();
                            admEscenas.setEscena(TipoEscena.ESCENA_JUEGOTRES);
                            admEscenas.liberarEscenaMenu();
                            break;
                        }
                    case OPCION_SCORES:
                        // Mostrar la pantalla de juego
                        musicaFondo.stop();
                        admEscenas.crearEscenaScores();
                        admEscenas.setEscena(TipoEscena.ESCENA_SCORES);
                        admEscenas.liberarEscenaMenu();
                        break;
                    case OPCION_AYUDA:
                        musicaFondo.stop();
                        admEscenas.crearEscenaAyuda();
                        admEscenas.setEscena(TipoEscena.ESCENA_AYUDA);
                        admEscenas.liberarEscenaMenu();
                    default:
                        return false;
                }
                return true;
            }
        });
        setChildScene(menu);
    }

    @Override
    public void onBackKeyPressed() {
        // Salir del juego
        musicaFondo.stop();

    }

    private void crearSonidos(){
        try {
            musicaFondo = MusicFactory.createMusicFromAsset(admRecursos.engine.getMusicManager(),
                    admRecursos.actividadJuego, "Intro.mp3");
        }
        catch (IOException e) {
            Log.i("cargarSonidos", "No se puede cargar demo.ogg");
        }
        musicaFondo.setLooping(true);
        musicaFondo.play();
    }

    public Music getMusicaFondo() {
        return musicaFondo;
    }


    @Override
    public TipoEscena getTipoEscena() {
        return TipoEscena.ESCENA_MENU;
    }

    @Override
    public void liberarEscena() {
        // Liberar cada recurso usado en esta escena
        // FONDO
        spriteFondo.detachSelf();   // Se desconecta de la escena
        spriteFondo.dispose();      // Libera la memoria
        musicaFondo.release();
        this.detachSelf();      // La escena se deconecta del engine
        this.dispose();         // Libera la memoria
    }
}
